package com.interview.write.DemoFive;

/**
 * @author javadaodechengxuyuan
 * 二叉树：每个节点有最多两个分叉，
 * 分别作为父节点的左值和右值，遵循左小右大的规则进行分叉
 */
public class Tree {
    private Node root;
    private Node current;
    private Node parent;
    /**
     * @author javadaodechengxuyuan
     * 为一颗二叉树添加节点
     */
    public void insert(long value){//为二叉树插入新的节点
        //创建新的节点
        Node newNode=new Node(value);

        //创建完后就该考虑把这个节点放在哪里了，下面这些代码就是用来判断将这个节点放在哪里的
        if(root==null){
            this.root=newNode;//如果root为空，那么第一次调用添加时应给root初始化
        }else{
            this.current=root;//初始化current
            while(true){//进入死循环，一直等到给newNode找到合适的位置时进行终止死循环
                if(this.current.getValue()>value){//比root小，放在左侧
                    this.parent=this.current;//让parent一直保留本次的current
                    this.current=this.current.getLeftNode();
                    if(this.current==null){//如果当前的左值为空，那么就终止循环并赋值给这个左值
                        this.parent.setLeftNode(newNode);//将这个新节点放在这个位置
                        return;//最终找到合适位置，死循环终止
                    }
                }else{//比root大，放在右侧
                    this.parent=this.current;//让parent一直保留本次的current
                    this.current=this.current.getRightNode();//将当前的节点重新赋值给下一次需要比较的节点
                    if(this.current==null){//如果当前的右值为空，那么就终止循环并赋值给这个左值
                        this.parent.setRightNode(newNode);//将这个新节点放在这个位置
                        return;//最终找到合适位置，死循环终止
                    }
                }
            }
        }
    }

    public Node getRoot() {
        return root;
    }

    public void setRoot(Node root) {
        this.root = root;
    }


}
